package main

import (
	"fmt"
	"math/rand"
	"sort"
)

func main() {
	s1s2() //回答问题
	fmt.Println("--------------------------------------------------")
	slice1() //有一个数组[1,4,9,16,2,5,10,15]，生成一个新切片，要求新切片元素是数组相邻2项的和。有一个数组[1,4,9,16,2,5,10,15]，生成一个新切片，要求新切片元素是数组相邻2项的和。
	fmt.Println("--------------------------------------------------")
	sj() //100随机并排序及次数

}

// 随机生成数字并sort
func sj() {
	fmt.Println(`数字重复统计
随机产生100个整数;数字的范围[-200,200];升序输出这些生成的数字并打印其重复的次数`)
	aa := make([]int, 100, 100)
	for k, _ := range aa {
		aa[k] = rand.Intn(400) - 200
		fmt.Print(aa[k], " ")
	}
	fmt.Println("")
	sort.Ints(aa)
	fmt.Println("----------------uniq----------")
	uniqInt(aa) //执行升序并打印其重复的次数

}

// 打印出其值及重复的次数
func uniqInt(a []int) {
	//数值及次数
	map1 := make(map[int]int)
	for _, v := range a {
		map1[v] += 1
	}

	//排序打印
	for k, v := range a {
		if k == 0 {
			fmt.Printf("%v %v\n", v, map1[v])
		} else if a[k] == a[k-1] {
			continue
		} else {
			fmt.Printf("%v %v\n", v, map1[v])
		}

	}
}

func slice1() {
	fmt.Println(`有一个数组[1,4,9,16,2,5,10,15]，生成一个新切片，要求新切片元素是数组相邻2项的和。`)
	a := []int{1, 4, 9, 16, 2, 5, 10, 15}
	sli1 := make([]int, len(a)-1, cap(a)-1)
	for s, _ := range sli1 {
		sli1[s] = a[s] + a[s+1]
	}
	fmt.Printf("新切片：%+v\n", sli1)
}

func s1s2() {
	fmt.Println(`看下面一段程序，回答问题
	s1 := make([]int, 3, 4)
	s2 := append(s1, 1)
请问:`)
	s1 := make([]int, 3, 4)
	s2 := append(s1, 1)
	fmt.Printf("1、s1、s2内各有什么元素？ \n答：s1=%+v\ts2=%v\n", s1, s2)

	s1[1] = 11
	fmt.Printf("2、s1修改一个远程会影响s2吗？\n答：会影响   s2: %+v \t\n", s2)

	//s2修改一个元素会影响s1吗？
	//答：会影响
	s2[2] = 22
	fmt.Printf("\ts2修改一个远程会影响s2吗？\n答：会影响  s1: %+v\n", s1)

	s2 = append(s1, 1, 1)
	fmt.Printf("3、s2再增加一个元素会怎么样？\n s2=%+v s1=%v \n", s2, s1)

}

// 批改意见
// 1. s2的长度比s1大1，因此s2修改最后一个元素对s1无影响；
// 2. s2增加一个元素会扩容
// 3. 不管数字范围是[-100, 100]还是[-200, 200]，Intn(m)的范围是[0, m)，会漏掉最后一个元素